//package com.skyyan.netty.jjf.protocol;
//
//import java.nio.charset.StandardCharsets;
//
///**
// * C.4 充值管理机注册响应报文 (下行)
// * AFN = 0x91
// *
// * 报文格式：
// * - 控制域：0x00 (下行)
// * - 地址域：9字节 (目标客户端地址)
// * - AFN：0x91
// * - 用户数据：16字节设备注册号
// * @author skyyan
// */
//public class RegisterAckMessage extends Message {
//
//    /**
//     * 构造一个下行的注册响应报文
//     * @param address 目标客户端地址 (9字节)
//     * @param deviceId 服务器分配的16字节设备注册号
//     */
//    public RegisterAckMessage(byte[] address, byte[] deviceId) {
//        super(FrameConstants.CONTROL_DOWNLINK, address, FrameConstants.AFN_REGISTER,
//                validateDeviceId(deviceId));
//    }
//
//    /**
//     * 供解码器使用的构造函数
//     * @param control 控制域
//     * @param address 地址域
//     * @param userData 用户数据（设备注册号）
//     */
//    public RegisterAckMessage(byte control, byte[] address, byte[] userData) {
//        super(control, address, FrameConstants.AFN_REGISTER, userData);
//    }
//
//    /**
//     * 创建一个基于字符串的设备注册号
//     * @param deviceIdStr 设备ID字符串（最多16字符）
//     * @return 16字节的设备注册号
//     */
//    public static byte[] createDeviceId(String deviceIdStr) {
//        if (deviceIdStr == null) {
//            deviceIdStr = "";
//        }
//
//        byte[] deviceId = new byte[16];
//        byte[] strBytes = deviceIdStr.getBytes(StandardCharsets.UTF_8);
//
//        // 复制字符串字节，不足16字节的用0填充
//        int copyLength = Math.min(strBytes.length, 16);
//        System.arraycopy(strBytes, 0, deviceId, 0, copyLength);
//
//        return deviceId;
//    }
//
//    /**
//     * 获取设备注册号的字符串表示
//     * @return 设备注册号字符串
//     */
//    public String getRegIdString() {
//        byte[] userData = getUserData();
//        if (userData == null || userData.length == 0) {
//            return "";
//        }
////
////        // 找到第一个0字节的位置（字符串结束）
////        int endIndex = userData.length;
////        for (int i = 0; i < userData.length; i++) {
////            if (userData[i] == 0) {
////                endIndex = i;
////                break;
////            }
////        }
////
////        return new String(userData, 0, endIndex, StandardCharsets.UTF_8);
//        return toHexString(userData);
//    }
//    public static String userDataToHexString(byte[] userData) {
//        // 检查 null 和长度
//        if (userData == null) {
//            throw new IllegalArgumentException("userData 不能为 null");
//        }
//        if (userData.length != 16) {
//            throw new IllegalArgumentException("userData 必须是 16 字节，实际长度: " + userData.length);
//        }
//
//        StringBuilder sb = new StringBuilder(32); // 16 字节 → 32 个 hex 字符
//        for (byte b : userData) {
//            sb.append(String.format("%02X", b & 0xFF));
//        }
//        return sb.toString();
//    }
//    public static String toHexString(byte[] userData) {
//        // 校验
//        if (userData == null) {
//            throw new IllegalArgumentException("userData 不能为空");
//        }
//        if (userData.length != 16) {
//            throw new IllegalArgumentException("userData 必须是 16 字节，实际：" + userData.length);
//        }
//
//        StringBuilder sb = new StringBuilder(32); // 16字节 → 32个字符
//        for (byte b : userData) {
//            sb.append(String.format("%02X", b & 0xFF));
//        }
//        return sb.toString();
//    }
//    /**
//     * 验证设备ID长度
//     * @param deviceId 设备ID
//     * @return 验证后的设备ID
//     */
//    private static byte[] validateDeviceId(byte[] deviceId) {
//        if (deviceId == null) {
//            return new byte[16];
//        }
//        if (deviceId.length != 16) {
//            throw new IllegalArgumentException("设备注册号必须为16字节");
//        }
//        return deviceId.clone();
//    }
//
//    @Override
//    public String toString() {
//        return super.toString() + ", regId=" + getRegIdString();
//    }
//}
//
